El siguiente documento corresponde a un trabajo de investigación del curso Visualización de datos y análisis estadístico del Posgrado Analista de Datos de la Universidad Cenfotec.
“Estadisticas y Modelado de la distribución biogeográfica de Pumas y Jaguares de un sector del continente americano”
https://www.inaturalist.org/
https://biodiversityinformatics.amnh.org/
library(dplyr)
library(tibble)
library(tidyr)
library(sp)
library(DT)
library(leaflet)
library(leaflet.extras)
library(raster)
library(rasterVis)
library(rgdal)
library(ggplot2)
library(plotly)
library(LaCroixColoR)
library(sf)
library(here)
library(devtools)
library(proto)
library(highcharter)
library(rgeos)
library(velox)
library(usdm)
library(gtools)
library(corrplot)
library(Hmisc)
library(dismo)
En esta sección se realizan una serie de procesos que conllevan al desarrollo de las bases de datos finales
Carga de la base de datos y de las variables que la conforman
df <- read.csv("E:/Analista de datos/DAT004/Proyecto Final/Datasets/samples/wildcats_df.csv", stringsAsFactors=F, sep=",", na.strings=c("","NA"), encoding="UTF-8")
colnames(df)
## [1] "X.U.FEFF.common_name" "scientific_name" "latitude"
## [4] "longitude" "created_at" "updated_at"
## [7] "place_country_name"
Cambio de nombre de las columnas
df <- df[,c(1:5,7)]
names(df)[1] <- "Nombre_Comun"
names(df)[2] <- "Nombre_Cientifico"
names(df)[3] <- "Latitud"
names(df)[4] <- "Longitud"
names(df)[5] <- "Fecha_Registro"
names(df)[6] <- "Pais"
colnames(df)
## [1] "Nombre_Comun" "Nombre_Cientifico" "Latitud"
## [4] "Longitud" "Fecha_Registro" "Pais"
Se imprime un resumen de datos por especie de modo que se pueda obtener un conteo inicial
df%>%
dplyr::group_by(Nombre_Comun)%>%
dplyr::summarise(length(Nombre_Comun))
Se realiza una correccion de datos en la columna de “Nombre_Comun” de forma que se estandaricen algunos registros que figuran como duplicados
ndf <- df%>%
mutate(Nombre_Comun=ifelse(Nombre_Comun=="Puma de América del Norte", "Puma",Nombre_Comun))%>%
mutate(Nombre_Comun=ifelse(Nombre_Comun=="Puma de América del Sur", "Puma",Nombre_Comun))
Nuevamente se imprime un resumen final de datos por especie
count_sp <- ndf%>%
group_by(Nombre_Comun)%>%
summarise(Count=length(Nombre_Comun))
plot_ly(data=count_sp, x = ~Nombre_Comun, y = ~Count, type = 'bar', text = ~Count, textposition = 'auto',
marker = list(color = c('rgba(204,204,204,1)', 'rgba(222,45,38,0.8)'),
line = list(color = c('rgba(204,204,204,1)', 'rgba(222,45,38,0.8)'),
width = 1.5))) %>%
layout(title = "Cantidad de especies registrados en el dataframe inicial",
xaxis = list(title = "Especies"),
yaxis = list(title = "Cantidad"))
cf <- colorFactor(c("#ffa500", "#13ED3F"), domain=ndf$Nombre_Comun)
m <- leaflet(df) %>% addTiles(group = "OSM (default)") %>%
addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
setView(-63.54105072, -8.88123188, zoom = 2) %>%
addCircles(~Longitud, ~Latitud, popup=ndf$Nombre_Comun, group = ndf$Nombre_Comun ,weight = 3, radius=4,
color=cf(ndf$Nombre_Comun), stroke = TRUE, fillOpacity = 0.5) %>%
addLegend("bottomright", colors= c("#ffa500", "#13ED3F"), labels=c("Puma", "Jaguar"), title="Especies") %>%
addLayersControl(
baseGroups = c("OSM (default)", "Toner", "Toner Lite"),
overlayGroups = ndf$Nombre_Comun,
options = layersControlOptions(collapsed = TRUE))%>%
suspendScroll()
m
El area de estudio con la que se pretende trabajar corresponde a Centro y Sudamrica, asi como el Caribe.
Algunas de las coberturas que se utilizan para conocer el habitat de las especies son variables climáticas que se derivan de los datos proporcionados por el Panel Intergubernamental sobre Cambio Climático y se produjeron utilizando Interpolación de basada en lecturas tomadas en estaciones meteorológicas de todo el mundo desde 1961 hasta 1990.
Los coberturas corresponden a:
*cld6190_ann : cobertura de nubes, anual
*dtr6190_ann : rango de temperatura diurna, anual
*ecoreg : Ecoregiones
*frs6190_ann : frecuencia de heladas, anual
*h_dem : Modelo Digital de Elevacion
*pre6190_ann : precipitacion, anual
*pre6190_I1 : precipitacion, enero
*pre6190_I4 : precipitacion, abril
*pre6190_I7 : precipitacion, julio
*pre6190_I10 : precipitacion, octubre
*tmn6190_ann : temperatura promedio, anual
*tmp6190_ann : temperatura minima, anual
*tmx6190_ann : temperatura maxima, anual
*vap6190_ann : presion de vapor, anual
r_files <- list.files(here::here("Datasets", "coverages"),
full.names = T)
r_files
## [1] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/cld6190_ann.asc"
## [2] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/dtr6190_ann.asc"
## [3] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/ecoreg.asc"
## [4] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/frs6190_ann.asc"
## [5] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/h_dem.asc"
## [6] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/pre6190_ann.asc"
## [7] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/pre6190_l1.asc"
## [8] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/pre6190_l10.asc"
## [9] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/pre6190_l4.asc"
## [10] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/pre6190_l7.asc"
## [11] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/tmn6190_ann.asc"
## [12] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/tmp6190_ann.asc"
## [13] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/tmx6190_ann.asc"
## [14] "E:/Analista de datos/DAT004/Proyecto Final/Datasets/coverages/vap6190_ann.asc"
st <- raster::stack(r_files)
raster::plot(st)
1 Mediterranean Forests, Woodlands & Scrub 2 Tropical & Subtropical Dry Broadleaf Forests 3 Temperate Broadleaf & Mixed Forests 4 Tropical & Subtropical Coniferous Forests 5 Temperate Grasslands, Savannas & Shrublands 6 Mangroves 7 ( ) 8 Montane Grasslands & Shrublands 9 Tropical & Subtropical Grasslands, Savannas & Shrublands 10 Tropical & Subtropical Moist Broadleaf Forests 11 Flooded Grasslands & Savannas 12 Montane Grasslands & Shrublands 13 Magellanic subpolar forests 14 Rock and Ice 15 ( )
ecoreg = raster(r_files[3])
raster::plot(ecoreg, main="Ecoregiones del area de estudio")
raster::hist(ecoreg, main="Histograma de las Ecoregiones del area de estudio", col="green")
A continuacion, se carga el un archivo espacial de tipo vectorial correspondiente a los paises que conforman el area de estudio.
area_estudio <- sf::st_read(dsn="E:/Analista de datos/DAT004/Proyecto Final/Datasets/samples/map.geojson", layer="map", quiet=TRUE)
map.area <- plot_geo(area_estudio, name=~pais, color = I("#89C5DA"))%>% hide_legend()
map.area
De previo se realiza una selección de la base de datos de las especies respecto del área de estudio
coords <- data.frame(x=ndf$Longitud, y=ndf$Latitud)
prj <- CRS("+proj=longlat +datum=WGS84 +no_defs")
points <- SpatialPointsDataFrame(coords, ndf, proj4string = prj)
wildcats <- crop(points,ecoreg)
wildcats <- data.frame(wildcats)
wildcats <- wildcats[,1:6]
Para luego visualizar los puntos de observacion de las especies a estudiar
cf2 <- colorFactor(c("#ffa500", "#13ED3F"), domain=wildcats$Nombre_Comun)
m2 <- leaflet(wildcats) %>% addTiles(group = "OSM (default)") %>%
addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
setView(-63.54105072, -8.88123188, zoom = 2) %>%
addCircles(~Longitud, ~Latitud, popup=wildcats$Nombre_Comun, group = wildcats$Nombre_Comun ,weight = 3, radius=4,
color=cf2(wildcats$Nombre_Comun), stroke = TRUE, fillOpacity = 0.5) %>%
addLegend("bottomright", colors= c("#ffa500", "#13ED3F"), labels=c("Puma", "Jaguar"), title="Especies") %>%
addLayersControl(
baseGroups = c("OSM (default)", "Toner", "Toner Lite"),
overlayGroups = wildcats$Nombre_Comun,
options = layersControlOptions(collapsed = TRUE))%>%
suspendScroll()
m2
Primero se realiza una selección final de la base de datos e inclusion de nuevas variables
wildcats$Hora_Registro <- strftime(wildcats$Fecha_Registro, format="%H") #col7
wildcats$Fecha_Registro <- as.POSIXct(wildcats$Fecha_Registro, tz="", format="%Y-%m-%d") #col5
wildcats$Y.M.R <- strftime(wildcats$Fecha_Registro, format="%Y-%m") #col8
wildcats$M.R <- format(wildcats$Fecha_Registro, "%m") #col9
wildcats$Y.R <- format(wildcats$Fecha_Registro, "%Y") #col10
wildcats <- wildcats[, colnames(wildcats)[c(1:4,6,5,8,10,9,7)]] #Reorganizacion de las columnas
Se procede a visualizar la base de datos
datatable(wildcats, extensions = c('Buttons','FixedColumns', 'RowReorder'),
filter = list(position = 'top', clear = FALSE),
options = list(dom = 'Bfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), dom = 't',
scrollX = TRUE,
fixedColumns = TRUE,
rowReorder = TRUE, order = list(c(0 , 'asc'))))
En este primer apartado se realizan analisis sobre estadísticas espacio-temporales respecto de los pumas y jaguares de un sector del continente americano
plot_ly(x= wildcats$Pais,split=wildcats$Nombre_Comun, color= I(cf2(wildcats$Nombre_Comun)),
frame=wildcats$M.R, type = "histogram", alpha = 0.6)%>%
layout(barmode = "overlay")
c.jaguars <- wildcats%>%
dplyr::filter(Nombre_Comun == "Jaguar")%>%
dplyr::group_by(Pais)%>%
dplyr::summarise(Cant=n())
c.pumas <- wildcats%>%
dplyr::filter(Nombre_Comun == "Puma")%>%
dplyr::group_by(Pais)%>%
dplyr::summarise(Cant=n())
data(worldgeojson, package = "highcharter")
highchart() %>%
hc_title(text = "Cantidad de Jaguares") %>%
hc_subtitle(text = "por pais") %>%
hc_add_series_map(map = worldgeojson, df = c.jaguars, name = "cantidad de individuos",
value = "Cant", joinBy = c("name", "Pais"), allAreas=FALSE, animation=TRUE)%>%
hc_colorAxis(min= 1,
type='logarithmic',
stops = color_stops())%>%
hc_tooltip(useHTML = TRUE, headerFormat = "",
pointFormat = "Pais: {point.name}/ Cantidad de especies: {point.Cant}")%>%
hc_legend(layout= 'horizontal',
verticalAlign= 'top')%>%
hc_mapNavigation(enabled = TRUE)
data(worldgeojson, package = "highcharter")
highchart() %>%
hc_title(text = "Cantidad de Pumas") %>%
hc_subtitle(text = "por pais") %>%
hc_add_series_map(map = worldgeojson, df = c.pumas, name = "cantidad de individuos",
value = "Cant", joinBy = c("name", "Pais"), allAreas= FALSE, animation=TRUE)%>%
hc_colorAxis(min= 1,
type='logarithmic',
stops = color_stops())%>%
hc_tooltip(useHTML = TRUE, headerFormat = "",
pointFormat = "Pais: {point.name}/ Cantidad de especies: {point.Cant}")%>%
hc_legend(layout= 'horizontal',
verticalAlign= 'top')%>%
hc_mapNavigation(enabled = TRUE)
c.jaguars <- wildcats%>%
dplyr::filter(Nombre_Comun == "Jaguar")%>%
dplyr::group_by(Fecha_Registro)%>%
dplyr::summarise(Cant=n())
c.pumas <- wildcats%>%
dplyr::filter(Nombre_Comun == "Puma")%>%
dplyr::group_by(Fecha_Registro)%>%
dplyr::summarise(Cant=n())
ct.jaguars <- ts(data=c.jaguars, start = c(2011,10), end = c(2019,12), frequency = 12)
ct.pumas <- ts(data=c.pumas, start = c(2011,10), end = c(2019,12), frequency = 12)
highchart(type = "stock") %>%
hc_title(text = "Cantidad de especies") %>%
hc_subtitle(text = "en la linea de tiempo de observacion") %>%
hc_add_series(ct.jaguars[,2], type = "line", pointInterval= 30*24*3600*1000, name="Cant de jaguares observados a la fecha", color = "#ffa500")%>%
hc_add_series(ct.pumas[,2], type = "line", pointInterval= 30*24*3600*1000, name="Cant de pumas observados a a fecha", color = "#13ED3F")%>%
hc_xAxis(title= list(text='Fechas'), type='datetime')%>%
hc_yAxis(title= list(text='Cantidad de especies observadas'), opposite = FALSE)
decomp_jaguars <- decompose(ct.jaguars[,2])
decomp_pumas <- decompose(ct.pumas[,2])
plot(decomp_jaguars)
par(adj = 1)
title(sub = "Jaguares", cex.sub = 1.5, font.sub = 3, col.sub = "#ffa500")
plot(decomp_pumas, sub="Pumas")
par(adj = 1)
title(sub = "Pumas", cex.sub = 1.5, font.sub = 3, col.sub = "#13ED3F")
e.m <- ggplot(wildcats, aes(x=Longitud, y=Latitud, frame=M.R, text = paste("Pais:", Pais))) +
borders("world", xlim = c(-120, -30), ylim = c(-50, 25))+
geom_point(data=filter(wildcats), shape = 21, colour = cf2(wildcats$Nombre_Comun), size = 1)+
facet_grid(cols = vars(Nombre_Comun)) +
labs(title = "Distribucion de las especies observadas segun mes")
ggplotly(e.m)%>%
animation_opts(
2000, easing = "elastic", redraw = FALSE
)%>%
animation_slider(
currentvalue = list(prefix = "Mes ", font = list(color="red"))
)
pd <- qplot(data = wildcats, x=Longitud, y=Latitud) +
stat_ellipse(geom = "polygon", alpha = 1/2, aes(fill = Nombre_Comun, frame=M.R))+
borders("world", xlim = c(-120, -30), ylim = c(-50, 25))+
geom_point(data=filter(wildcats), aes(frame=M.R), shape = 21, fill = cf2(wildcats$Nombre_Comun), size = 2)+
facet_grid(cols = vars(Nombre_Comun)) +
labs(title = "Patron de Distribucion de las Especies")
ggplotly(pd)%>%
animation_opts(
2000, easing = "elastic", redraw = FALSE
)%>%
animation_slider(
currentvalue = list(prefix = "Mes ", font = list(color="red"))
)
dn <- ggplot(wildcats, aes(x=Longitud, y=Latitud)) +
borders("world", regions=".", xlim = c(-120, -30), ylim = c(-50, 25))+
stat_density2d(aes(fill = stat(level), frame=wildcats$M.R), geom="polygon", alpha=0.3) +
geom_point(data=filter(wildcats), aes(frame=M.R), shape = 21, fill = cf2(wildcats$Nombre_Comun), size = 2, alpha=0.3)+
facet_grid(cols = vars(Nombre_Comun)) +
scale_fill_viridis_c(option = "viridis") +
theme(legend.position = "magma") +
labs(title = "Densidad segun distribucion por especie")
ggplotly(dn)%>%
animation_opts(
4000, easing = "elastic", redraw = FALSE
)%>%
animation_slider(
currentvalue = list(prefix = "Mes ", font = list(color="red"))
)
Ecoregiones/Biomas 1 Mediterranean Forests, Woodlands & Scrub 2 Tropical & Subtropical Dry Broadleaf Forests 3 Temperate Broadleaf & Mixed Forests 4 Tropical & Subtropical Coniferous Forests 5 Temperate Grasslands, Savannas & Shrublands 6 Mangroves 7 ( ) 8 Montane Grasslands & Shrublands 9 Tropical & Subtropical Grasslands, Savannas & Shrublands 10 Tropical & Subtropical Moist Broadleaf Forests 11 Flooded Grasslands & Savannas 12 Montane Grasslands & Shrublands 13 Magellanic subpolar forests 14 Rock and Ice 15 ( )
ecoreg_spec <- raster::extract(ecoreg, wildcats[,4:3]) %>%
cbind(wildcats, .) %>%
as.data.frame()
ecoreg_spec <- na.omit(ecoreg_spec)
ecoreg_spec$Ecoreg <- as.character(ecoreg_spec$.)
ggplot(ecoreg_spec, aes(x=Longitud, y=Latitud, color = ecoreg_spec$Ecoreg)) +
borders("world", xlim = c(-120, -30), ylim = c(-50, 25))+
geom_point(data=filter(ecoreg_spec), shape = 21, size = 1)+
scale_colour_manual(values = lacroix_palette("PassionFruit", n=14))+
facet_grid(cols = vars(Nombre_Comun)) +
labs(title = "Especies observadas segun ecoregion en la que se encuentran")
ggplot(ecoreg_spec, aes(y=Ecoreg, x=Nombre_Comun, colour = Ecoreg)) +
geom_count(alpha=0.5) +
scale_colour_manual(values = lacroix_palette("PassionFruit", n=14))+
labs(title = "Cantidad de especies observadas por ecoregion",
x = "Especie",
y = "Ecoregiones",
size = "")
Proceso de union de los puntos de observacion de las especies y los raster de las variables ambientales
#Se extraen temas relevantes de las variables ambientales
select_r = dropLayer(st,3)
jp_swd <- raster::extract(select_r, wildcats[,4:3]) %>%
cbind(wildcats, .) %>%
as.data.frame()
#Se elimina las filas con valores nulos
jp_swd <- na.omit(jp_swd)
mt <- cor(jp_swd[,11:23])
corrplot(mt, method = 'circle', type = 'upper')
Esto se hace a traves del analisis en regresion lineal VIF, el cual es el factor de inflación de la varianza. Este cuantifica la intensidad de la multicolinealidad en un análisis de regresión normal de mínimos cuadrados. Proporciona un índice que mide hasta qué punto la varianza (el cuadrado de la desviación estándar estimada) de un coeficiente de regresión estimado se incrementa a causa de la colinealidad.
# Analisis VIF
vif.res <- vif(x = jp_swd[,11:ncol(jp_swd)])
vif.step <- vifstep(x = jp_swd[,11:ncol(jp_swd)], th = 10)#Los factores VIF mayores que 10 implican problemas graves de multicolinealidad
vrs <- vif.step@results$Variables %>% as.character()
vif.step
## 4 variables from the 13 input variables have collinearity problem:
##
## pre6190_ann tmp6190_ann tmn6190_ann tmx6190_ann
##
## After excluding the collinear variables, the linear correlation coefficients ranges between:
## min correlation ( pre6190_l10 ~ pre6190_l1 ): -0.009063609
## max correlation ( vap6190_ann ~ frs6190_ann ): -0.8508242
##
## ---------- VIFs of the remained variables --------
## Variables VIF
## 1 cld6190_ann 3.025670
## 2 dtr6190_ann 1.678499
## 3 frs6190_ann 4.102199
## 4 h_dem 2.447628
## 5 pre6190_l1 1.755003
## 6 pre6190_l10 5.388244
## 7 pre6190_l4 4.074227
## 8 pre6190_l7 2.896292
## 9 vap6190_ann 5.176151
vrs
## [1] "cld6190_ann" "dtr6190_ann" "frs6190_ann" "h_dem" "pre6190_l1"
## [6] "pre6190_l10" "pre6190_l4" "pre6190_l7" "vap6190_ann"
jp_fnl <- jp_swd %>%
as_tibble %>%
dplyr::select(Nombre_Cientifico:Longitud, vrs)
head(jp_fnl)
Con respecto al resultado de la correlacion se grafican las siguientes variables:
*cld6190_ann : cobertura de nubes, anual
*dtr6190_ann : rango de temperatura diurna, anual
*frs6190_ann : frecuencia de heladas, anual
*h_dem : Modelo Digital de Elevacion
*pre6190_I1 : precipitacion, enero
*pre6190_I4 : precipitacion, abril
*pre6190_I7 : precipitacion, julio
*pre6190_I10 : precipitacion, octubre
*vap6190_ann : presion de vapor, anual)
r_corr= st[[c(1,2,4,5,7,8,9,10,14)]]
raster::pairs(r_corr)
El primer paso es extraer los valores de los predictores en las ubicaciones de los puntos
pvals <- raster::extract(st, wildcats[,4:3]) %>%
cbind(wildcats, .) %>%
as.data.frame()
presvals <- pvals[,11:24]
predictors <- st
backgr <- randomPoints(predictors, 500)
absvals <- raster::extract(predictors, backgr)
pb <- c(rep(1, nrow(presvals)), rep(0, nrow(absvals)))
sdmdata <- data.frame(cbind(pb, rbind(presvals, absvals)))
sdmdata[,'ecoreg'] = as.factor(sdmdata[,'ecoreg'])
head(sdmdata)
tail(sdmdata)
summary(sdmdata)
## pb cld6190_ann dtr6190_ann ecoreg frs6190_ann
## Min. :0.0000 Min. :32.00 Min. : 66 10 :688 Min. : 0.00
## 1st Qu.:0.0000 1st Qu.:58.00 1st Qu.: 99 11 :259 1st Qu.: 0.00
## Median :1.0000 Median :64.00 Median :115 9 :160 Median : 1.00
## Mean :0.6736 Mean :63.82 Mean :112 8 :123 Mean : 11.65
## 3rd Qu.:1.0000 3rd Qu.:68.00 3rd Qu.:123 5 : 74 3rd Qu.: 2.00
## Max. :1.0000 Max. :83.00 Max. :175 (Other):166 Max. :214.00
## NA's :9 NA's :9 NA's : 62 NA's :9
## h_dem pre6190_ann pre6190_l1 pre6190_l10
## Min. : 0.0 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 107.0 1st Qu.: 35.00 1st Qu.: 22.00 1st Qu.: 27.50
## Median : 193.0 Median : 40.00 Median : 53.00 Median : 43.00
## Mean : 490.4 Mean : 48.76 Mean : 52.81 Mean : 54.32
## 3rd Qu.: 526.0 3rd Qu.: 66.00 3rd Qu.: 75.00 3rd Qu.: 82.00
## Max. :4920.0 Max. :138.00 Max. :173.00 Max. :210.00
## NA's :57 NA's :9 NA's :9 NA's :9
## pre6190_l4 pre6190_l7 tmn6190_ann tmp6190_ann
## Min. : 0.00 Min. : 0.00 Min. :-104.0 Min. : 35.0
## 1st Qu.: 22.00 1st Qu.: 6.00 1st Qu.: 140.0 1st Qu.:226.0
## Median : 34.00 Median : 28.00 Median : 165.0 Median :254.0
## Mean : 45.28 Mean : 42.45 Mean : 149.1 Mean :233.1
## 3rd Qu.: 65.00 3rd Qu.: 71.00 3rd Qu.: 187.5 3rd Qu.:264.0
## Max. :148.00 Max. :194.00 Max. : 227.0 Max. :282.0
## NA's :9 NA's :9 NA's :9 NA's :9
## tmx6190_ann vap6190_ann
## Min. :122.0 Min. : 10.0
## 1st Qu.:308.0 1st Qu.:204.5
## Median :324.0 Median :257.0
## Mean :312.1 Mean :229.1
## 3rd Qu.:335.0 3rd Qu.:267.0
## Max. :359.0 Max. :308.0
## NA's :9 NA's :9
Para ello se utiliza la función (glm) la cual permite ajustar modelos lineales generalizados. Esta funcion devuelve un objeto modelo.
En un primer modelo se trabajara con:
*cld6190_ann : cobertura de nubes, anual
*dtr6190_ann : rango de temperatura diurna, anual
*frs6190_ann : frecuencia de heladas, anual
*h_dem : Modelo Digital de Elevacion
*pre6190_I1 : precipitacion, enero
*pre6190_I4 : precipitacion, abril
*pre6190_I7 : precipitacion, julio
*pre6190_I10 : precipitacion, octubre
*vap6190_ann : presion de vapor, anual)
En el segundo con todas las variables
m1 <- glm ( pb ~ cld6190_ann + dtr6190_ann + frs6190_ann + h_dem + pre6190_l1 + pre6190_l10 + pre6190_l4 + pre6190_l7 + vap6190_ann, data = sdmdata )
class ( m1 )
## [1] "glm" "lm"
summary ( m1 )
##
## Call:
## glm(formula = pb ~ cld6190_ann + dtr6190_ann + frs6190_ann +
## h_dem + pre6190_l1 + pre6190_l10 + pre6190_l4 + pre6190_l7 +
## vap6190_ann, data = sdmdata)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.0999 -0.4707 0.1940 0.3046 1.0077
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.382e-01 1.602e-01 -3.985 7.08e-05 ***
## cld6190_ann 7.567e-03 1.927e-03 3.927 9.00e-05 ***
## dtr6190_ann 4.495e-03 7.680e-04 5.853 5.94e-09 ***
## frs6190_ann 2.029e-03 6.587e-04 3.080 0.002107 **
## h_dem -8.450e-05 2.258e-05 -3.743 0.000189 ***
## pre6190_l1 1.509e-03 4.505e-04 3.348 0.000834 ***
## pre6190_l10 4.674e-03 5.162e-04 9.054 < 2e-16 ***
## pre6190_l4 -5.923e-03 5.860e-04 -10.108 < 2e-16 ***
## pre6190_l7 1.351e-03 4.270e-04 3.164 0.001591 **
## vap6190_ann 9.905e-04 3.944e-04 2.512 0.012126 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for gaussian family taken to be 0.1829705)
##
## Null deviance: 320.40 on 1472 degrees of freedom
## Residual deviance: 267.69 on 1463 degrees of freedom
## (59 observations deleted due to missingness)
## AIC: 1690.4
##
## Number of Fisher Scoring iterations: 2
m2 = glm ( pb ~ . , data = sdmdata )
m2
##
## Call: glm(formula = pb ~ ., data = sdmdata)
##
## Coefficients:
## (Intercept) cld6190_ann dtr6190_ann ecoreg2 ecoreg3 ecoreg4
## 0.8481994 0.0003222 0.0076312 -0.2080109 0.2056482 -0.0591186
## ecoreg5 ecoreg6 ecoreg8 ecoreg9 ecoreg10 ecoreg11
## 0.1378429 -0.0442762 0.0486044 -0.0145809 0.0721378 0.5030165
## ecoreg12 ecoreg13 ecoreg14 frs6190_ann h_dem pre6190_ann
## 0.2519882 0.3957019 0.7397254 -0.0017491 -0.0001387 0.0124540
## pre6190_l1 pre6190_l10 pre6190_l4 pre6190_l7 tmn6190_ann tmp6190_ann
## -0.0032611 0.0012264 -0.0065611 -0.0013567 -0.0004383 0.0071411
## tmx6190_ann vap6190_ann
## -0.0082765 -0.0011003
##
## Degrees of Freedom: 1467 Total (i.e. Null); 1442 Residual
## (64 observations deleted due to missingness)
## Null Deviance: 319.2
## Residual Deviance: 216 AIC: 1407
El algoritmo BIOCLIM calcula la similitud de una ubicación comparando los valores de las variables ambientales en cualquier ubicación con una distribución porcentual de los valores en ubicaciones conocidas de ocurrencia. Cuanto más cerca del percentil 50 (la mediana), más adecuada es la ubicación. Las colas de la distribución no se distinguen, es decir, el percentil 10 se trata como equivalente al percentil 90.
Para este caso solo se usa datos de presencia, por lo que usamos ‘presvals’ en lugar de ‘sdmdata’.
bc <- bioclim ( presvals [, c ( 'cld6190_ann', 'dtr6190_ann', 'frs6190_ann', 'h_dem', 'pre6190_l1', 'pre6190_l10', 'pre6190_l4', 'pre6190_l7', 'vap6190_ann' )])
class ( bc )
## [1] "Bioclim"
## attr(,"package")
## [1] "dismo"
bc
## class : Bioclim
##
## variables: cld6190_ann dtr6190_ann frs6190_ann h_dem pre6190_l1 pre6190_l10 pre6190_l4 pre6190_l7 vap6190_ann
##
##
## presence points: 1002
## cld6190_ann dtr6190_ann frs6190_ann h_dem pre6190_l1 pre6190_l10 pre6190_l4
## 1 66 118 0 107 72 30 34
## 2 57 99 0 31 113 110 88
## 3 60 121 1 250 14 45 14
## 5 63 123 10 757 86 43 32
## 7 56 84 1 51 48 98 25
## 9 60 119 1 275 15 46 14
## 10 58 97 0 2 121 111 87
## 12 60 95 0 2 23 58 12
## 14 66 118 0 110 72 30 34
## 15 53 116 1 200 47 130 43
## pre6190_l7 vap6190_ann
## 1 6 260
## 2 150 269
## 3 42 266
## 5 6 214
## 7 134 268
## 9 43 266
## 10 165 278
## 12 47 281
## 14 6 260
## 15 171 238
## (... ... ...)
pairs ( bc )
Todos estos objetos “modelo”, independientemente de su clase exacta, pueden utilizarse con la función de predicción para hacer predicciones para cualquier combinación de valores de las variables independientes. Hacer tales predicciones para algunos entornos puede ser muy útil para explorar y comprender las predicciones del modelo. A continuación, se realizan predicciones con el objeto del modelo glm ‘m1’ y para el modelo bioclim ‘bc’, para tres registros con valores para las variables: cld6190_ann, dtr6190_ann, frs6190_ann, h_dem, pre6190_l1, pre6190_l10, pre6190_l4, pre6190_l7, vap6190_ann
cld6190_ann = c(40, 60, 80)
dtr6190_ann = c(40, 100, 140)
frs6190_ann = c(50, 125, 200)
h_dem = c(1000, 3000, 6000)
pre6190_l1 = c(50, 100, 150)
pre6190_l10 = c(50, 100, 150)
pre6190_l4 = c(50, 100, 150)
pre6190_l7 = c(50, 100, 150)
vap6190_ann = c(50, 100, 250)
pdt = data.frame ( cbind (cld6190_ann, dtr6190_ann, frs6190_ann, h_dem, pre6190_l1, pre6190_l10, pre6190_l4, pre6190_l7, vap6190_ann))
pdt
predict (m1 , pdt) #categorias de prediccion= 1: menos frecuente encontrar especies, 3: mas frecuente encontrar especies
## 1 2 3
## -0.008807341 0.525429699 0.984308281
predict (bc , pdt)
response (bc)
En el espectro de colores del mapa se observan los valores mas altos como aquellos donde es idoneo encontrar estas especies, al contrario en el espectro, donde es menos idoneo
p <- predict (predictors,m1)
plot (p)